﻿using PmSadis.Repositories.Abstract;
using PmSadis.Models;
using System.Linq;
using PmSadis.Dal;
using System;
using System.Data.Entity;
using System.Collections.Generic;

namespace PmSadis.Repositories
{
    /// <summary>
    /// Хранилище субконтрактов
    /// </summary>
    public class SubContractRepository : IListRepository<SubContract>
    {
        private ModelsContext _context = new ModelsContext();

        /// <summary>
        /// Разорвать связь с генконтрактом
        /// </summary>
        /// <param name="subContractId">Идентификатор субконтракта</param>
        public void BreakLinkWithGenContract(int subContractId)
        {
            var subContract = _context.SubContracts.FirstOrDefault(x => x.ContractId == subContractId);
            subContract.GenContractId = null;
            _context.Entry(subContract).State = EntityState.Modified;
            _context.SaveChanges();
        }

        /// <summary>
        /// Список всех субконтрактов
        /// </summary>
        public IQueryable<SubContract> All
        {
            get
            {
                return _context.SubContracts;
            }
        }

        /// <summary>
        /// Создать или редактировать субконтракт
        /// </summary>
        /// <param name="subContract">Субконтракт</param>
        public object Edit(SubContract subContract)
        {
            var dateNow = DateTime.Now;
            if (subContract.ContractId == 0)
            {
                subContract.DateCreate = dateNow;
                subContract.DateUpdate = dateNow;
                _context.Entry(subContract).State = EntityState.Added;
            }
            else
            {
                subContract.DateUpdate = dateNow;
                _context.Entry(subContract).State = EntityState.Modified;
            }

            _context.SaveChanges();

            return subContract.ContractId;
        }

        /// <summary>
        /// Удалить субконтракт
        /// </summary>
        /// <param name="id">Идентификатор субконтракта</param>
        public void Delete(object id)
        {
            var subContractId = (int)id;
            var subContract = _context.SubContracts.FirstOrDefault(x => x.ContractId == subContractId);
            if (subContract == null) return;

            _context.SubContracts.Remove(subContract);
            _context.SaveChanges();
        }

        /// <summary>
        /// Привязать субконтракты к генконтракту
        /// </summary>
        /// <param name="contractsId">Идентификаторы субконтрактов</param>
        /// <param name="genContractId">Идентификатор генконтракта</param>
        public void LinkSubContracts(List<int> contractsId, int genContractId)
        {
            var subContracts = _context.SubContracts.Where(x => contractsId.Contains(x.ContractId)).ToList();

            subContracts.ForEach(x =>
            {
                x.GenContractId = genContractId;
                Edit(x);
            });
        }
    }
}
